perm filename COMFM1.F4[JC,MUS]1 blob
sn#077163 filedate 1973-12-08 generic text, type T, neo UTF8
00100 C This is taken from the "Handbook of Mathematical Functions"
00200 C by Abramowitz and Stegun, Dover press S1272, 1965.
00300 C Chapter 9 is on Bessel Functions. The polynomial
00400 C approximations are found in section 9.4, pages 369
00500 C and 370. The recursion formula for generating higher
00600 C orders from J0 and J1 is found at the bottom of
00700 C table 9.1, page 390
00800
00900 SUBROUTINE BESCOEF(MI,X,I,K)
01000 REAL MI,J0,J1
01100 COMMON FREQ(3,0/50,50),FUNC(50)
01200 IF(I.GT.1)GO TO 30
01300 IF(MI.GE.3.0)GO TO 10
01400 xs=(MI/3)**2
01500 j0=1.0+xs*(-2.2499997+xs*(1.2656208+xs*(-0.3163866+
01600 1xs*(0.0444479+xs*(-0.0039444+xs*0.00021)))))
01700 j1=MI*(.5+xs*(-0.56249985+xs*(0.21093573+
01800 1xs*(-0.03954289+xs*(0.00443319+xs*(-0.00031761+
01900 2xs*0.00001109))))))
02000 GO TO 20
02100 10 xs=3.0/MI
02200 j0=(1.0/sqrt(MI))*(0.79788456+xs*(-0.00000077+
02300 1xs*(-0.0055274+xs*(-0.00009512+xs*(0.00137237+
02400 2xs*(-0.00072805+xs*0.00014476))))))*
02500 3cos(MI-0.78539816+xs*(-0.04166397+
02600 4xs*(-0.00003954+xs*(0.00262573+
02700 5xs*(-0.00054125+xs*(-0.00029333+
02800 6xs*0.00013558))))))
02900 j1=(1.0/sqrt(MI))*(0.79788456+xs*(0.00000156+
03000 1xs*(0.01659667+
03100 1xs*(0.00017105+xs*(-0.00249511+xs*(0.00113653-
03200 2xs*0.00020033))))))*
03300 3cos(MI-2.35619449+xs*(0.12499612+xs*(0.0000565+
03400 4xs*(-0.00637879+xs*(0.00074348+xs*(0.00079824-
03500 5xs*0.00029166))))))
03600 20 FREQ(2,0,K)=J0
03700 FREQ(2,1,K)=J1
03800 FREQ(2,2,K)=J1
03900 RETURN
04000 30 Y=I
04100 IF(MI.LE.0.0000001)GO TO 50
04200 IJ=I*2
04300 X=((2.0*(Y-1.0))/MI)*FREQ(2,IJ-2,K)-FREQ(2,IJ-4,K)
04400 RETURN
04500 50 X=0
04600 RETURN
04700 END
00050 SUBROUTINE SIDEBANDS(CAR,XMOD,CINDEX,K)
00100 COMMON FREQ(3,0/50,50),FUNC(50)
00150 IT=-1.0
00300 MAX=CINDEX+5.0
00350 IF(FREQ(1,50,1).LT.MAX*2.)FREQ(1,50,1)=MAX*2.
00400 DO 100 J=0,MAX*2,2
00500 I=J/2
00600 NORDER=I
00700 IF(I.NE.1)CALL BESCOEF(CINDEX,COEF,NORDER,K)
00800 IF(I.GT.0)GO TO 20
00900 FREQ(1,I,K)=CAR
01000 FREQ(3,I,K)=0.0
01100 GO TO 30
01200 20 XI=I
01300 YMOD=XI*XMOD
01400 FREQ(1,J-1,K)=CAR+YMOD
01500 FREQ(1,J,K)=CAR-YMOD
01600 IF(I.EQ.1)GO TO 10
01700 FREQ(2,J-1,K)=COEF
01800 FREQ(2,J,K)=COEF
01900 10 FREQ(3,J-1,K)=I
01950 IF(IT)I=-I
02000 FREQ(3,J,K)=I
02050 IT=-IT
02100 30 CONTINUE
02200 100 CONTINUE
02500 102 FORMAT(3F)
02525 NAX=MAX
02537 CALL REFLECT(NAX,K)
02550 RETURN
02600 END
02700
00100 SUBROUTINE REFLECT(MAX,K)
00200 COMMON FREQ(3,0/50,50),FUNC(50)
00210 DO 100 N=0,MAX*2
00255 100 IF(FREQ(3,N,K).LT.0.0)FREQ(2,N,K)=-FREQ(2,N,K)
00300 DO 201 J=0,(MAX*2)-1
00400 DO 201 I=J+1,MAX*2
00500 IF(FREQ(1,J,K).OR.FREQ(1,I,K).EQ.99999.)GO TO 201
00600 IF(ABS(FREQ(1,J,K)).NE.ABS(FREQ(1,I,K)))GO TO 201
00700 IF(FREQ(1,J,K).GT.FREQ(1,I,K))GO TO 20
00800 FREQ(2,I,K)=FREQ(2,I,K)-FREQ(2,J,K)
00900 FREQ(1,J,K)=99999.
01000 GO TO 201
01100 20 FREQ(2,J,K)=FREQ(2,J,K)-FREQ(2,I,K)
01200 FREQ(1,I,K)=99999.
01300 201 CONTINUE
01400 RETURN
01500 END
01600
01700
01800 C MAIN PROGRAM
01900 COMMON FREQ(3,0/50,50),FUNC(50)
02100 10 ACCEPT 100,C,XM,ZI1,ZI2
02200 100 FORMAT(4F)
02250 CALL GEN
02275 DO 300 IS=1,25
02287 CI=ZI1+(ZI2-ZI1)*FUNC(IS)
02300 300 CALL SIDEBANDS(C,XM,CI,IS)
02400 CALL DISP
02500 MAX=FREQ(1,50,1)
03410 C TYPE 101,(((FREQ(K,L,M),K=1,3),L=0,MAX),M=1,25)
03430 101 FORMAT(1H (3F/))
03450 GO TO 10
03500 END
03600
03700 SUBROUTINE GEN
03800 COMMON FREQ(3,0/50,50),FUNC(50)
03900 X=1./25.
04000 DO 100 I=1,25
04100 Y=I-1
04200 100 FUNC(I)=X*Y
04300 RETURN
04400 END
04500
04550 SUBROUTINE DISP
04555 DIMENSION I(1),IJ(1000)
04560 COMMON FREQ(3,0/50,50),FUNC(50)
04600 CALL DPYSET(1,IJ,1000)
04700 CALL ALINE(-400,0,400,0)
04800 CALL ALINE(-400,400,-400,0)
04900 MAX=FREQ(1,50,1)
04950 KL=1
05000 DO 200 J=0,MAX
05005 IF(FREQ(1,J,KL).EQ.99999.)GO TO 200
05010 IX=ABS(FREQ(1,J,KL))-400.
05012 ZZ=IX
05015 IY=(ZZ+400.)*(-1.)+400.*FREQ(2,J,KL)
05017 BASE=(ZZ+400.)*(-1.)
05020 KL=KL+1
05022 CALL AIVECT(IX,IY)
05025 DO 200 K=2,25
05100 IF(FREQ(1,J,K).EQ.99999.)GO TO 200
05102 IF(FREQ(1,J,K).EQ.0.0)GO TO 200
05105 IX=IX+20
05110 IY=FREQ(2,J,K)*400.+BASE
05112 IBASE=BASE
05114 IF(IY.LE.IBASE)IY=(IABS(IY)-IABS(IBASE))+IBASE
05115 CALL AVECT(IX,IY)
05600 200 CONTINUE
05700 CALL DPYOUT(1)
06000 RETURN
06100 END